/**
 * @(#) ImpiantoElettrico.java
 */

package it.unibo.iss.domotica.edDomain;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Properties;

public class ImpiantoElettrico implements IImpiantoElettrico
{
	private static ImpiantoElettrico instance;	
	private static Properties properties = null;
	private Hashtable<String, IElettrodomestico> elettrodomestici = new Hashtable<String, IElettrodomestico>();
	
	public ImpiantoElettrico() {
	}
	
	public void setElettrodomestici(Hashtable<String, IElettrodomestico> elettrodomestici, Properties prop) {
		this.elettrodomestici = elettrodomestici;
		properties = prop;
	}
	
	public void setElettrodomestici(List<IElettrodomestico> listEd) {
		for(IElettrodomestico ed : listEd) {
			elettrodomestici.put(ed.getNome(), ed);
		}
	}
	
	public static Properties getProperties() {
		return properties;
	}

	public static void setProperties(Properties prop) {
		properties = prop;
	}

	public static ImpiantoElettrico getInstance() {
		if(instance == null)
			instance = new ImpiantoElettrico();
		
		return instance;
	}
	
	public void setConsumptionEd(String edName, double consumption) {
		Elettrodomestico ed = (Elettrodomestico) getED(edName);
		ed.setConsumoAttuale(consumption);
		elettrodomestici.remove(edName);
		elettrodomestici.put(edName, ed);
	}

//	@Override
//	public Hashtable<String, Elettrodomestico> getListED() {
//		return elettrodomestici;		
//	}
	
	@Override
	public ArrayList<String> getListEDName() {
		return new ArrayList<String>(elettrodomestici.keySet());		
	}
	
	@Override
	public ArrayList<IElettrodomestico> getListEDValues() {
		return new ArrayList<IElettrodomestico>(elettrodomestici.values());		
	}

	@Override
	public double getMinConsumption(String edName) {
		// TODO if properties == null
		
		Elettrodomestico ed = (Elettrodomestico)getED(edName);
		
//		if(ed.getCatConsumo() == CatConsumptionEnum.LOW) {
//			return Double.valueOf(properties.getProperty("minConsumoBasso"));
//		}
//		else if(ed.getCatConsumo() == CatConsumptionEnum.MEDIUM) {
//			return Double.valueOf(properties.getProperty("minConsumoMedio"));
//		}
//		else if(ed.getCatConsumo() == CatConsumptionEnum.HIGH) {
//			return Double.valueOf(properties.getProperty("minConsumoAlto"));
//		}
//		
//		return -1;
		
		return ed.getCatConsumption().getMinConsumption();
		
	}

	@Override
	public double getMaxConsumption(String edName) {
		// TODO if properties == null
		
		Elettrodomestico ed = (Elettrodomestico)getED(edName);
		
//		if(ed.getCatConsumo() == CatConsumptionEnum.LOW) {
//			return Double.valueOf(properties.getProperty("maxConsumoBasso"));
//		}
//		else if(ed.getCatConsumo() == CatConsumptionEnum.MEDIUM) {
//			return Double.valueOf(properties.getProperty("maxConsumoMedio"));
//		}
//		else if(ed.getCatConsumo() == CatConsumptionEnum.HIGH) {
//			return Double.valueOf(properties.getProperty("maxConsumoAlto"));
//		}
//		
//		return -1;
		
		return ed.getCatConsumption().getMaxConsumption();
	}
	
	@Override
	public double getEstimatedConsumption(String edName) {
		Elettrodomestico ed = (Elettrodomestico)getED(edName);
		
		return ed.getMediumConsumption();
	}

	@Override
	public double getEDConsumption(String edName) {
		Elettrodomestico ed = (Elettrodomestico)getED(edName);
		
		if(ed == null)
			return -1;
		
		return ed.getConsumption();
	}

	@Override
	public IElettrodomestico getED(String edName) {
		return (IElettrodomestico)elettrodomestici.get(edName);
	}
	
	public void putED(String edName, Elettrodomestico ed) {
		elettrodomestici.put(edName, ed);
	}
	
	public void clear() {
		elettrodomestici.clear();
	}
}
